package act.hpx.demo.shiro.realm;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Collection;
import java.util.Set;

import org.apache.ibatis.reflection.SystemMetaObject;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.realm.jdbc.JdbcRealm;
import org.apache.shiro.subject.PrincipalCollection;
/**
 * 创建自己的Realm
 * Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。
 * 也就是说，当对用户执行认证（登录）和授权（访问控制）验证时，Shiro会从应用配置的Realm中查找用户及其权限信息。 
 * 从这个意义上讲，Realm实质上是一个安全相关的DAO：它封装了数据源的连接细节，并在需要时将相关数据提供给Shiro。
 * 当配置Shiro时，你必须至少指定一个Realm，用于认证和（或）授权。
 * 配置多个Realm是可以的，但是至少需要一个。 
 * Shiro内置了可以连接大量安全数据源（又名目录）的Realm，如LDAP、关系数据库（JDBC）、类似INI的文本配置资源以及属性文件等。
 * 如果缺省的Realm不能满足需求，你还可以插入代表自定义数据源的自己的Realm实现。 
 * @author huangpeixin
 *
 */
public class MyJdbcRealm extends JdbcRealm {
	private static final String AUTHENTICATION_QUERY =  "SELECT password FROM user WHERE userName = ?";
	private static final String USER_ROLES_QUERY =  "SELECT role.name FROM role , user_role ur, user "
												+ " WHERE  role.id = ur.roleId AND ur.userId = user.id "
												+ " AND user.userName=?";
	private static final String PERMISSIONS_QUERY =  "SELECT permission.name FROM role_permission rp, role , permission "
												+ " WHERE rp.permissionId = permission.id AND rp.roleId = role.id "
												+ " AND role.name = ?";

	public MyJdbcRealm() {
		super();
		super.setAuthenticationQuery(AUTHENTICATION_QUERY);
		super.setPermissionsQuery(PERMISSIONS_QUERY);
		super.setUserRolesQuery(USER_ROLES_QUERY);
		super.setPermissionsLookupEnabled(true);
	}

	@Override
	protected Set<String> getPermissions(Connection conn, String username, Collection<String> roleNames)
			throws SQLException {
		System.out.println("MyJdbcRealm.getPermissions()");
		// TODO Auto-generated method stub
		return super.getPermissions(conn, username, roleNames);
	}
	
}
